package com.demo.data.struct2.排序;

//冒泡排序
/**原理：比较两个相邻的元素，将值大的元素交换至右端。

思路：依次比较相邻的两个数，将小数放在前面，大数放在后面。即在第一趟：首先比较第1个和第2个数，将小数放前，大数放后。然后比较第2个数和第3个数，将小数放前，大数放后，如此继续，直至比较最后两个数，将小数放前，大数放后。重复第一趟步骤，直至全部排序完成。

举例说明：要排序数组：int[] arr={6,3,8,2,9,1};

第一趟排序：

　　　　第一次排序：6和3比较，6大于3，交换位置：  3  6  8  2  9  1

　　　　第二次排序：6和8比较，6小于8，不交换位置：3  6  8  2  9  1

　　　　第三次排序：8和2比较，8大于2，交换位置：  3  6  2  8  9  1

　　　　第四次排序：8和9比较，8小于9，不交换位置：3  6  2  8  9  1

　　　　第五次排序：9和1比较：9大于1，交换位置：  3  6  2  8  1  9

　　　　第一趟总共进行了5次比较， 排序结果：      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序：

　　　　第一次排序：3和6比较，3小于6，不交换位置：3  6  2  8  1  9

　　　　第二次排序：6和2比较，6大于2，交换位置：  3  2  6  8  1  9

　　　　第三次排序：6和8比较，6大于8，不交换位置：3  2  6  8  1  9

　　　　第四次排序：8和1比较，8大于1，交换位置：  3  2  6  1  8  9

　　　　第二趟总共进行了4次比较， 排序结果：      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序：

　　　　第一次排序：3和2比较，3大于2，交换位置：  2  3  6  1  8  9

　　　　第二次排序：3和6比较，3小于6，不交换位置：2  3  6  1  8  9

　　　　第三次排序：6和1比较，6大于1，交换位置：  2  3  1  6  8  9

　　　　第二趟总共进行了3次比较， 排序结果：         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序：

　　　　第一次排序：2和3比较，2小于3，不交换位置：2  3  1  6  8  9

　　　　第二次排序：3和1比较，3大于1，交换位置：  2  1  3  6  8  9

　　　　第二趟总共进行了2次比较， 排序结果：        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序：

　　　　第一次排序：2和1比较，2大于1，交换位置：  1  2  3  6  8  9

　　　　第二趟总共进行了1次比较， 排序结果：  1  2  3  6  8  9

---------------------------------------------------------------------

最终结果：1  2  3  6  8  9
 * @author DELL
 *
 */
public class BubbleSort {

	public static int[] sort(int[] arr)
	{
	    boolean mark = true;//用mark来做标记
	    for (int i = 0; i < arr.length - 1 && mark; i++)//外层循环控制排序趟数
	    {
	        mark = false;
	        for (int j = 0; j < arr.length - 1 - i; j++)
	        {
	            if (arr[j] > arr[j + 1])
	            {
	            	Util.swap(arr, j, j+1);
	                mark = true;
	            }
	        }
	        System.out.println("循环一次");
	    }
	    return arr;
	}
	
	public static void sort2(int[] a) {
		int n = a.length - 1; // 每次需要循环的次数
		while (true) {
			int last = 0; // 表示最后一次交换时的索引位置
			for (int i = 0; i < n; i++) {
				if (a[i] > a[i + 1]) {
	            	Util.swap(a, i, i+1);
	            	last = i;
	            }
			}
			n = last;
			if(n == 0) {
				break;
			}
		}
	}

	public static void main(String[] args) {
		int[] arr = {6,3,8,2,9,1};
		//Util.display(BubbleSort.sort(arr));
		int[] arr2 = {2,1,3,4,5,6};
		//Util.display(BubbleSort.sort(arr2));
		int[] arr3 = {6,3,8,2,9,1};
		BubbleSort.sort2(arr3);
		Util.display(arr3);
	}

}
